package com.tienon.message.thread.task;

import java.util.Date;
import java.util.concurrent.Callable;

import org.apache.log4j.Logger;

import com.tienon.message.entity.Raw_msg_batch;
import com.tienon.message.util.ErrorMsg;
import com.tienon.message.util.SpringUtil;

/**
 * 
 * 原始表数据处理task 
 * 一条数据 一个task
 * @author xiuye
 *
 */
public class RawMsgTask implements Callable<Boolean> {

	private static Logger log = Logger.getLogger(RawMsgTask.class);

	// 用于插入数据库使用
	private Raw_msg_batch data;

	/**
	 * 单任务构造器，构造是传入原始表数据
	 * @param data
	 */
	public RawMsgTask(Raw_msg_batch data) {

		this.data = data;

	}

	/**
	 * 校验消息业务码
	 * @return
	 */
	private boolean validateBsn_cd() {
		log.info("批次号 " + data.getBatId() + ": 校验消息业务码");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

	/**
	 * 匹配layout模板
	 * @return
	 */
	private boolean matchLayout() {
		log.info("批次号 " + data.getBatId() + ": 匹配layout模板");
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

	/**
	 * 处理数据并且插入数据操作
	 * 插入数据到原始表状态为待发送，插入重复视为成功
	 * @return
	 */
	private boolean insertDataToRawMsg() {

		boolean result = false;
		
		log.info("批次号：" + data.getBatId() + "流水号：" + data.getSerail() + "内容:"
				+ data.getMsg() + "成功插入发送表"+"当前线程："+Thread.currentThread().getName());
		/**
		 * 插入时间是当前时间，发送时间根据实际业务待定。
		 */
		data.setOccDate(new Date());
		data.setOccTime(new Date());
		data.setSendTime(new Date());
		data.setSendTimes(0);
		data.setState(1);
		try {
			/**
			 * 把插入数据到数据库操作交给子任务处理
			 * 这样子任务在spring的管理下事务能起到作用
			 * 
			 */
			RawMsgBatchDBSubTask subTask = SpringUtil
					.getBean(RawMsgBatchDBSubTask.class);
			subTask.addRawMsgBatch(data);
			
			log.debug("批次号：" + data.getBatId() + "流水号：" + data.getSerail()
					+ "内容:" + data.getMsg() + "成功插入Raw_msg_batch数据表"+"当前线程："+Thread.currentThread().getName());
			result = true;
		} catch (Exception e) {
			result = ErrorMsg.isRepeatInsert(e);
			log.error("批次号：" + data.getBatId() + "流水号：" + data.getSerail()
					+ "内容:" + data.getMsg() + "Raw_msg_batch插入数据有异常，异常原因:"
					+ ErrorMsg.getErrorMsg(e)+result+"当前线程："+Thread.currentThread().getName());
			if(!result){
				e.printStackTrace();
			}

		}
		if (result == true) {
			log.debug("批次号：" + data.getBatId() + "流水号：" + data.getSerail()
					+ "内容:" + data.getMsg() + "成功插入原始表Raw_msg_batch"+result+"当前线程："+Thread.currentThread().getName());
		} else {
			log.debug("批次号：" + data.getBatId() + "流水号：" + data.getSerail()
					+ "内容:" + data.getMsg()
					+ "插入原始表Raw_msg_batch失败，具体异常原因在以上堆栈打印"+result+"当前线程："+Thread.currentThread().getName());
		}

		return result;
	}

	// 处理任务并返回结果
	@Override
	public Boolean call() throws Exception {
		return this.validateBsn_cd() && this.matchLayout()
				&& this.insertDataToRawMsg();
	}

}
